package com.omesoft.hksnore.util.web;

import android.util.Log;

import org.ksoap2clone.SoapEnvelope;
import org.ksoap2clone.serialization.SoapObject;
import org.ksoap2clone.serialization.SoapSerializationEnvelope;
import org.kxml2.kdom.Element;
import org.kxml2.kdom.Node;

import java.util.Iterator;
import java.util.Map;

public class WebServiceUtils {
    /**
     * 访问.Net WebService
     *
     * @param methodName
     * @param bodyParams
     * @return
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static String callDotNetWS(String methodName, Map bodyParams) {
        final String SOAP_ACTION = AppConstant.OMESOFT_NAMESPACE + methodName;
        // 第一：实例化SoapObject 对象，指定webService的命名空间（从相关WSDL文档中可以查看命名空间），以及调用方法名称。
        SoapObject request = new SoapObject(AppConstant.OMESOFT_NAMESPACE, methodName);

        Object soapResult = null;
        if (bodyParams != null && !bodyParams.isEmpty()) {
            for (Iterator it = bodyParams.entrySet().iterator(); it.hasNext();) {
                // 遍历MAP
                Map.Entry<String, Object> e = (Map.Entry<String, Object>) it.next();
                // 第二步：假设方法有参数的话,设置调用方法参数
                request.addProperty(e.getKey().toString(), e.getValue());
            }
        } // 第三步：设置SOAP请求信息(参数部分为SOAP协议版本号，与你要调用的webService中版本号一致)。类型：VER1.0,VER1.1,VER1.2:
        // 第四步：注册Envelope
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);// SOAP
        // 1.1
        envelope.dotNet = true;// 是否是.Net WebService(不是，是Java的cfx WebService)
        envelope.bodyOut = request;
        // 对应wsdl文件创建SOAPHEADER元素
        Element[] header = new Element[1];
        // 创建父元素
        header[0] = new Element().createElement(AppConstant.OMESOFT_NAMESPACE, AppConstant.OMESOFT_SOAPHEADER_ParentElement_Name);
        // 创建父元素对应的子元素
        Element username = new Element().createElement(AppConstant.OMESOFT_NAMESPACE,
                AppConstant.OMESOFT_SOAPHEADER_ChildElement_Name1);
        Element pass = new Element().createElement(AppConstant.OMESOFT_NAMESPACE,
                AppConstant.OMESOFT_SOAPHEADER_ChildElement_Name2);
        // 为子元素赋值
        username.addChild(Node.TEXT, AppConstant.OMESOFT_SOAPHEADER_USERNAME);
        header[0].addChild(Node.ELEMENT, username);
        pass.addChild(Node.TEXT, AppConstant.OMESOFT_SOAPHEADER_PASSWORD);
        header[0].addChild(Node.ELEMENT, pass);
        envelope.headerOut = header;
        envelope.setOutputSoapObject(request);

        // 第五步：构建传输对象，并指明WSDL文档URL(使用自己的AndroidHttpTransport来设置超时时间)
        MyAndroidHttpTransport androidHT = new MyAndroidHttpTransport(AppConstant.OMESOFT_WSDL_URL, 15000);
        try {
            Log.e("test", "正在请求webService，请稍等.........call");
            androidHT.call(SOAP_ACTION, envelope);

            // 第六步：调用WebService(其中参数为1：命名空间+方法名称，2：Envelope对象):
            // 获取返回的数据 ksoap2能够将返回的xml转换成SoapObject对象，然后我们就可以通过操作对象的方式来获取需要的数据了。
            // 特别注意这一步可能会报org.ksoap2.serialization.SoapPrimitive异常：可以参考http://blog.sina.com.cn/s/blog_519d338501011o2w.html。但是在最后用result的时候再转换，也还是会报异常
//             soapResult = (SoapObject) envelope.bodyIn;
//             Log.e("test", "请求成功，返回结果：" + soapResult.toString());
//             Log.e("test", "返回结果长度:" + soapResult.getPropertyCount());
            Log.e("test", "正在请求webService，请稍等.........getResponse");
            soapResult  = envelope.getResponse();

        } catch (Exception e) {
            Log.e("test", "callDotNetWS_Exception:" + e.getMessage());
            return null;
        }
        if (soapResult != null) {
            return soapResult.toString();
        } else {
            Log.d("test", "请求webService，返回空");
            return null;
        }

    }

    /**
     * 访问挂号 WebService
     *
     * @param methodName
     * @param bodyParams
     * @return
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static String callRegistrationWS(String methodName, Map bodyParams) {
        final String SOAP_ACTION = AppConstant.OMESOFT_NAMESPACE + methodName;
        // 第一：实例化SoapObject 对象，指定webService的命名空间（从相关WSDL文档中可以查看命名空间），以及调用方法名称。
        SoapObject request = new SoapObject(AppConstant.OMESOFT_NAMESPACE, methodName);

        Object soapResult = null;
        if (bodyParams != null && !bodyParams.isEmpty()) {
            for (Iterator it = bodyParams.entrySet().iterator(); it.hasNext();) {
                // 遍历MAP
                Map.Entry<String, Object> e = (Map.Entry<String, Object>) it.next();
                // 第二步：假设方法有参数的话,设置调用方法参数
                request.addProperty(e.getKey().toString(), e.getValue());
            }
        } // 第三步：设置SOAP请求信息(参数部分为SOAP协议版本号，与你要调用的webService中版本号一致)。类型：VER1.0,VER1.1,VER1.2:
        // 第四步：注册Envelope
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);// SOAP
        // 1.1
        envelope.dotNet = true;// 是否是.Net WebService(不是，是Java的cfx WebService)
        envelope.bodyOut = request;
        // 对应wsdl文件创建SOAPHEADER元素
        Element[] header = new Element[1];
        // 创建父元素
        header[0] = new Element().createElement(AppConstant.OMESOFT_NAMESPACE, AppConstant.OMESOFT_SOAPHEADER_ParentElement_Name);
        // 创建父元素对应的子元素
        Element username = new Element().createElement(AppConstant.OMESOFT_NAMESPACE,
                AppConstant.OMESOFT_SOAPHEADER_ChildElement_Name1);
        Element pass = new Element().createElement(AppConstant.OMESOFT_NAMESPACE,
                AppConstant.OMESOFT_SOAPHEADER_ChildElement_Name2);
        // 为子元素赋值
        username.addChild(Node.TEXT, AppConstant.OMESOFT_SOAPHEADER_USERNAME);
        header[0].addChild(Node.ELEMENT, username);
        pass.addChild(Node.TEXT, AppConstant.OMESOFT_SOAPHEADER_PASSWORD);
        header[0].addChild(Node.ELEMENT, pass);
        envelope.headerOut = header;
        envelope.setOutputSoapObject(request);

        // 第五步：构建传输对象，并指明WSDL文档URL(使用自己的AndroidHttpTransport来设置超时时间)
        MyAndroidHttpTransport androidHT = new MyAndroidHttpTransport(AppConstant.OMESOFT_WSDL_URL, 5000);
        try {
            // Log.e("test", "正在请求webService，请稍等.........");
            androidHT.call(SOAP_ACTION, envelope);

            // 第六步：调用WebService(其中参数为1：命名空间+方法名称，2：Envelope对象):
            // 获取返回的数据 ksoap2能够将返回的xml转换成SoapObject对象，然后我们就可以通过操作对象的方式来获取需要的数据了。
            // 特别注意这一步可能会报org.ksoap2.serialization.SoapPrimitive异常：可以参考http://blog.sina.com.cn/s/blog_519d338501011o2w.html。但是在最后用result的时候再转换，也还是会报异常
            // soapResult = (SoapObject) envelope.bodyIn;
            // Log.e("test", "请求成功，返回结果：" + soapResult.toString());
            // Log.e("test", "返回结果长度:" + soapResult.getPropertyCount());

            soapResult = envelope.getResponse();

        } catch (Exception e) {
            // Log.e("test", "callDotNetWS_Exception:" + e.getMessage());
        }
        if (soapResult != null) {
            return soapResult.toString();
        } else {
            return null;
        }

    }

}
